package com.yunyao.dao.service.act.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yunyao.dao.mapper.ActHiProcinstMapper;
import com.yunyao.dao.model.ActHiProcinst;
import com.yunyao.dao.service.act.IActHiProcinstService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author xingjishuai
 * @since 2024-07-02
 */
@Service
public class ActHiProcinstServiceImpl extends ServiceImpl<ActHiProcinstMapper, ActHiProcinst> implements IActHiProcinstService {

    /**
     * 根据流程实例ID获取历史流程实例信息
     *
     * @param processInstanceId 流程实例ID
     * @return 如果流程实例ID为空或无效，返回null；否则返回对应的历史流程实例信息
     */
    @Override
    public ActHiProcinst getByProcessInstanceId(String processInstanceId) {
        // 检查流程实例ID是否为空或无效
        if (StringUtils.isBlank(processInstanceId)) {
            return null;
        }

        // 创建查询条件封装对象
        LambdaQueryWrapper<ActHiProcinst> wrapper = new LambdaQueryWrapper<>();
        // 设置查询条件：根据流程实例ID查询历史流程实例
        wrapper.eq(ActHiProcinst::getProcInstId, processInstanceId);

        // 执行查询并返回结果
        return getOne(wrapper);
    }

    /**
     * 结束流程实例更新
     *
     * 当流程实例结束时，更新流程实例的历史信息，包括结束时间、结束活动ID和持续时间
     * 如果流程实例不存在，则不进行任何操作
     *
     * @param processInstanceId 流程实例ID，用于标识特定的流程实例
     * @param endActId 结束活动的ID，标识流程结束时的活动
     */
    @Override
    public void endUpdate(String processInstanceId, String endActId) {
        // 创建查询包装器，用于查询指定流程实例ID的历史流程实例
        LambdaQueryWrapper<ActHiProcinst> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(ActHiProcinst::getProcInstId, processInstanceId);
        ActHiProcinst actHiProcinst = getOne(wrapper);

        // 如果找不到对应的流程实例，则直接返回，不进行后续操作
        if (actHiProcinst == null) {
            return;
        }

        // 更新流程实例的结束时间和结束活动ID
        actHiProcinst.setEndTime(new Date());
        actHiProcinst.setEndActId(endActId);

        // 计算并设置流程实例的持续时间（结束时间减去开始时间）
        actHiProcinst.setDuration(actHiProcinst.getEndTime().getTime() - actHiProcinst.getStartTime().getTime());

        // 更新数据库中的流程实例历史信息
        updateById(actHiProcinst);
    }

}
